/**
 * 负责分发动作的文件
 */
import {
   LOGIN_OK, REGISTER_OK, UPDATA_USER_INFO, EXIT_LOGIN,
   USE_COOKIE_GET_USERINFO,
} from './action-type' // 导入动作类型
import { SAVE_CHAT_LIST } from '../common-type'
import { getUserInfoByCookieAxios } from '../../api/api'
import io from 'socket.io-client'

/**
 * socket.io
 * @param {OBJECT} dispatch 接收服务端发送过来最新的消息对象时提交的动作
 * @param {STRING} userid 发送源Id
 */
function initIO(dispatch, userid) {
   //判断socket 有没有连接
   if (!io.socket) {
      //连接socket
      io.socket = io('ws://localhost:5000')
      //获取服务端返回的消息
      io.socket.on('receiveMsg', function (chatMsg) {
         console.log('客户端接收服务端返回的消息', chatMsg)
         //消息得实时发送和接收
         if ((userid === chatMsg.from || userid === chatMsg.to) && dispatch) {
            //分发同步动作
            dispatch({
               type: SAVE_CHAT_LIST,
               data: chatMsg
            })
         }
      })
   }
}
//异步发送消息的函数
export const sendMsgIo = ({ from, to, content }) => {
   return () => {
      //连接socket 把消息发送给socket服务端
      initIO();
      //把消息发送给socket服务端
      io.socket.emit('sendMsg', { from, to, content })
   }
}

/* 提交登录成功的动作 */
export const loginOkAction = (data) => {
   return async (dispath) => {
      initIO(dispath, data._id)
      dispath({
         type: LOGIN_OK,
         data
      })
   }
}
/* 提交注册用户信息成功的动作 */
export const registerAction = (data) => {
   return (dispath) => {
      initIO(dispath, data._id)
      dispath({
         type: REGISTER_OK,
         data
      })
   }
}
/* 更新用户基本信息 */
export const updataUserInfoAction = (data) => {
   return {
      type: UPDATA_USER_INFO,
      data
   }
}
/* 退出登录操作 */
export const exitLoginAction = () => {
   return {
      type: EXIT_LOGIN,
      data: {}
   }
}
/* 根据cookie分发获取用户信息的动作 */
export const getUserInfoToCookieAction = () => {
   return async (dispath) => {
      const { data } = await getUserInfoByCookieAxios()
      initIO(dispath, data._id)
      dispath({
         type: USE_COOKIE_GET_USERINFO,
         data
      })
   }
}